package com.jmb.demo.Container;

import com.jmb.demo.simple.Pair;

/**
 * @author jin
 * @ 2021-04-19 20:42
 * 这个地方我们演示一下，上界为莫个具体类，比如我们最开始在simple写了一个Pair类，然后我在这里定义了一个子类
 * 限定以下参数是Number,然后如下边代码
 * 限定类型以后，如果我们类型错误使用的话，编译器会提示我们，然后我们指定边界后，类型擦除时候就不会直接转成object了而是转成我们限定的边界类型。
 */
// 这个地方我们把我们的泛型类限定为了Number，然后又继承了我们的Pair类，那么我们实现的方法,first和second就可以直接用Number处理了
public class NumberPair<U extends Number,V extends Number> extends Pair<U,V> {
    public NumberPair(U first, V second) {
        super(first, second);
    }
    // 这是一个求和的方法
    public double sum(){
        return getFirst().doubleValue()+ getSecond().doubleValue();
    }

    public static void main(String[] args) {
        NumberPair<java.lang.Integer, Double> pair = new NumberPair<>(10, 12.34);
        double  sum = pair.sum();
        System.out.println(sum);
    }
    // 我们在实现一个上界为一个接口的例子
    // <T extends  Comparable<T>>这地方确实不好理解这种语法，不过他是一个递归类型限制，T就是数据类型，
    // 然后必须实现Comparable接口,然后必须可以与相同的类型元素比较
    public static <T extends  Comparable<T>>T max(T[] arr){
        T max=arr[0];
        for (int i = 0; i <arr.length ; i++) {
            if (arr[i].compareTo(max)>0){
                max =  arr[i];
            }
        }
        return max;
    }
}
